home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / game / shoot / ADoom_src_1_2.lha / ADoom_src / c2p_020.s < prev    next >
Text File  |  1998-02-28  |  22KB  |  824 lines

  1.         mc68020
  2.         section    text,code
  3.  
  4.         include    "exec/execbase.i"
  5.         include "exec/funcdef.i"
  6.         include    "exec/exec_lib.i"
  7.         include    "hardware/custom.i"
  8.  
  9. ; ---------------------------------------------------------------------
  10.  
  11. ; void __asm c2p_020 (register __a2 UBYTE *fBUFFER,
  12. ;                     register __a4 PLANEPTR *planes,
  13. ;                     register __d0 ULONG signals1,
  14. ;                     register __d1 ULONG signals2,
  15. ;                     register __d4 ULONG signals3,
  16. ;                     register __d2 ULONG pixels,     // width*height
  17. ;                     register __d3 ULONG offset,     // byte offset into plane
  18. ;                     register __a1 UBYTE *xlate,
  19. ;                     register __a5 struct Task *othertask,
  20. ;                     register __a0 UBYTE *chipbuffer); // 2*width*height
  21. ;
  22. ; Pipelined CPU+blitter 8-plane chunky to planar converter.
  23. ; Optimised for 68020/30 with fastmem.
  24. ;
  25. ; Author: Peter McGavin (e-mail peterm@maths.grace.cri.nz), 21 April 1994
  26. ; Based on James McCoull's 4-pass blitter algorithm.
  27. ;
  28. ; This code is public domain.
  29. ;
  30. ; Perform first 2 merges (Fast->Chip) with the CPU (in 1 pass).
  31. ; Wait for previous QBlit() to completely finish (signals2).
  32. ; Then launch merge passes 3 & 4 with QBlit().
  33. ; Return immediately after launching passes 3 & 4.
  34. ; Signal this task signals1 (asynchronously) after completion of pass 3.
  35. ; Signal this task signals2 from CleanUp() on completion of QBlit().
  36. ; Also signal othertask signals3 from CleanUp() on completion of QBlit().
  37. ; Calling task must wait for signals1 before next call to c2p_020()
  38. ;
  39. ; (Unimplemented speedup idea: use a "scrambled" chunky buffer.
  40. ; Skip pass 1.)
  41. ;
  42. ; Example usage:
  43. ;
  44. ;    /* clear fBUFFER, fBUFFER_CMP, and planes here */
  45. ;    if ((sigbit1 = AllocSignal(-1)) == -1 ||
  46. ;        (sigbit2 = AllocSignal(-1)) == -1)
  47. ;        die ("Can't allocate signal!\n");
  48. ;    SetSignal ((1<<sigbit1)|(1<<sigbit2),  // initial state is "finished"
  49. ;           (1<<sigbit1)|(1<<sigbit2));
  50. ;    for (;;) {
  51. ;        /* render to fBUFFER here */
  52. ;        Wait (1<<sigbit1);  // wait for prev c2p8() to finish pass 3
  53. ;            c2p8 (fBUFFER, &RASTPORT->BitMap->Planes[0],
  54. ;              1<<sigbit1, 1<<sigbit2, WIDTH*HEIGHT,
  55. ;                     WIDTH/8*LINESTOSKIP, xlate);
  56. ;    }
  57. ;    Wait (1<<sigbit1);  // wait for last c2p8 to finish pass 3
  58. ;    Wait (1<<sigbit2);  // wait for last c2p8 to completely finish
  59. ;    FreeSignal(sigbit1);
  60. ;    FreeSignal(sigbit2);
  61. ;
  62. ; ---------------------------------------------------------------------
  63.  
  64.         xref    _GfxBase
  65.  
  66. ;maxwidth    equ    320    ; must be a multiple of 32
  67. ;maxheight    equ    200
  68. ;maxpixels    equ    maxwidth*maxheight
  69.  
  70. _LVOQBlit    equ    -276
  71. cleanup        equ    $40
  72.  
  73. xload        macro    ; translate 4 8-bit pixels to 6-bit EHB using xlate[]
  74.         move.b    (\1,a2),d4
  75.         move.b    (a6,d4.w),\2
  76.         lsl.w    #8,\2
  77.         move.b    (\1+8,a2),d4
  78.         move.b    (a6,d4.w),\2
  79.         swap    \2
  80.         move.b    (\1+2,a2),d4
  81.         move.b    (a6,d4.w),\2
  82.         lsl.w    #8,\2
  83.         move.b    (\1+10,a2),d4
  84.         move.b    (a6,d4.w),\2
  85.         endm
  86.  
  87. ;        section chunks,code
  88.  
  89.     ifeq    depth-8
  90.         xdef    _c2p_8_020
  91. _c2p_8_020:
  92.     else
  93.     ifeq    depth-6
  94.         xdef    _c2p_6_020
  95. _c2p_6_020:
  96.     else
  97.         fail    "unsupported depth!"
  98.     endc
  99.     endc
  100.         movem.l    d2-d7/a2-a6,-(sp)
  101.  
  102. ; save arguments
  103.         move.l    #mybltnode,a0
  104.         move.l    a3,(buff2-mybltnode,a0)
  105.         adda.l    d2,a3
  106.         move.l    a3,(buff3-mybltnode,a0)
  107.         move.l    a5,(othertask-mybltnode,a0)
  108.         move.l    a2,(chunky-mybltnode,a0)
  109.         move.l    a4,(planes-mybltnode,a0)
  110.         move.l    d0,(signals1-mybltnode,a0)
  111.         move.l    d1,(signals2-mybltnode,a0)
  112.         move.l    d4,(signals3-mybltnode,a0)
  113.         move.l    d2,(pixels-mybltnode,a0)
  114.         lsr.l    #1,d2
  115.         move.l    d2,(pixels2-mybltnode,a0)
  116.         lsr.l    #1,d2
  117.         move.l    d2,(pixels4-mybltnode,a0)
  118.         lsr.l    #1,d2
  119.         move.l    d2,(pixels8-mybltnode,a0)
  120.         lsr.l    #1,d2
  121.         move.l    d2,(pixels16-mybltnode,a0)
  122.         move.l    d3,(offset-mybltnode,a0)
  123.     IFLE depth-6
  124.         move.l    a1,(xlate-mybltnode,a0)
  125.     ENDC
  126.  
  127. ;-------------------------------------------------
  128. ;original chunky data
  129. ;0        a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0
  130. ;2        c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  131. ;4        e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0
  132. ;6        g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  133. ;8        i7i6i5i4i3i2i1i0 j7j6j5j4j3j2j1j0
  134. ;10        k7k6k5k4k3k2k1k0 l7l6l5l4l3l2l1l0
  135. ;12        m7m6m5m4m3m2m1m0 n7n6n5n4n3n2n1n0
  136. ;14        o7o6o5o4o3o2o1o0 p7p6p5p4p3p2p1p0
  137. ;16        q7q6q5q4q3q2q1q0 r7r6r5r4r3r2r1r0
  138. ;18        s7s6s5s4s3s2s1s0 t7t6t5t4t3t2t1t0
  139. ;20        u7u6u5u4u3u2u1u0 v7v6v5v4v3v2v1v0
  140. ;22        w7w6w5w4w3w2w1w0 x7x6x5x4x3x2x1x0
  141. ;24        y7y6y5y4y3y2y1y0 z7z6z5z4z3z2z1z0
  142. ;26        A7A6A5A4A3A2A1A0 B7B6B5B4B3B2B1B0
  143. ;28        C7C6C5C4C3C2C1C0 D7D6D5D4D3D2D1D0
  144. ;30        E7E6E5E4E3E2E1E0 F7F6F5F4F3F2F1F0
  145. ;-------------------------------------------------
  146.  
  147.         move.l    (pixels16-mybltnode,a0),d6 ; loop count = pixels/16
  148.  
  149.     IFLE depth-6
  150.         move.l    (xlate-mybltnode,a0),a6    ; a6 -> xlate
  151.     ENDC
  152.         move.l    (pixels4-mybltnode,a0),d0
  153.         movea.l    (buff2-mybltnode,a0),a0    ; a0 -> buff2 (in Chip)
  154.         lea    (a0,d0.l),a1    ; a1 -> buff2+pixels/4
  155.         lea    (a1,d0.l),a4    ; a4 -> buff2+pixels/2
  156.         lea    (a4,d0.l),a5    ; a5 -> buff2+3*pixels/4
  157.  
  158.         move.l    #$0f0f0f0f,d7    ; constant
  159.         move.l    #$00ff00ff,d5    ; constant
  160.  
  161.     IFGT depth-6            ; 8-plane version
  162.         subq.w    #1,d6
  163.         movem.l    (a2)+,d0-d3    ; AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp
  164.         move.l    d2,d4
  165.         lsr.l    #8,d4
  166.         eor.l    d0,d4
  167.         and.l    d5,d4
  168.         eor.l    d4,d0
  169.         lsl.l    #8,d4
  170.         eor.l    d4,d2
  171.         move.l    d3,d4
  172.         lsr.l    #8,d4
  173.         eor.l    d1,d4
  174.         and.l    d5,d4
  175.         eor.l    d4,d1
  176.         lsl.l    #8,d4
  177.         eor.l    d4,d3
  178.         move.l    d1,d4
  179.         lsr.l    #4,d4
  180.         bra    start8
  181.     ELSE
  182.         bra    end_pass1loop
  183.     ENDC
  184.  
  185.         cnop    0,4
  186.  
  187. ; main loop (starts here) processes 16 chunky pixels at a time
  188. ; convert 16 pixels (passes 1 and 2 combined)
  189.  
  190.     IFGT depth-6            ; 8-plane version
  191.  
  192. mainloop:    movem.l    (a2)+,d0-d3    ; AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp
  193.  
  194.         move.l    d4,(a4)+
  195.  
  196.         move.l    d2,d4
  197.         lsr.l    #8,d4
  198.         eor.l    d0,d4
  199.         and.l    d5,d4
  200.         eor.l    d4,d0
  201.         lsl.l    #8,d4
  202.         eor.l    d4,d2
  203.         move.l    d3,d4
  204.  
  205.         move.l    a6,(a1)+
  206.  
  207.         lsr.l    #8,d4
  208.         eor.l    d1,d4
  209.         and.l    d5,d4
  210.         eor.l    d4,d1
  211.         lsl.l    #8,d4
  212.         eor.l    d4,d3
  213.         move.l    d1,d4
  214.         lsr.l    #4,d4
  215.  
  216.         move.l    a3,(a5)+
  217.  
  218. start8:        eor.l    d0,d4
  219.         and.l    d7,d4
  220.         eor.l    d4,d0        ; d0=AEIMCGKO
  221.         lsl.l    #4,d4
  222.         eor.l    d1,d4        ; d4=aeimcgko
  223.         move.l    d3,d1
  224.         lsr.l    #4,d1
  225.         eor.l    d2,d1
  226.  
  227.         move.l    d0,(a0)+
  228.  
  229.         and.l    d7,d1
  230.         eor.l    d1,d2
  231.         lsl.l    #4,d1
  232.         eor.l    d1,d3
  233.         movea.l    d2,a6        ; a6=BFJNDHLP
  234.         movea.l    d3,a3        ; a3=bfjndhlp
  235.  
  236. end_pass1loop:    dbra    d6,mainloop
  237.  
  238.         move.l    d4,(a4)+
  239.         move.l    a6,(a1)+
  240.         move.l    a3,(a5)+
  241.  
  242.     ELSE                ; 6-plane version with pixel xlate table
  243.  
  244. mainloop:    moveq    #0,d4
  245.         xload    0,d0        ; d0=xlate[AaIiCcKk]
  246.         xload    4,d1        ; d1=xlate[EeMmGgOo]
  247.         xload    1,d2        ; d2=xlate[BbJjDdLl]
  248.         xload    5,d3        ; d3=xlate[FfNnHhPp]
  249.         adda.w    #16,a2
  250.  
  251.         move.l    d1,d4
  252.         lsr.l    #4,d4
  253.         eor.l    d0,d4
  254.         and.l    d7,d4
  255.         eor.l    d4,d0        ; d0=AEIMCGKO
  256.  
  257.         move.l    d0,(a0)+
  258.  
  259.         lsl.l    #4,d4
  260.         eor.l    d4,d1        ; d1=aeimcgko
  261.         move.l    d3,d4
  262.         lsr.l    #4,d4
  263.  
  264.         move.l    d1,(a4)+
  265.  
  266.         eor.l    d2,d4
  267.         and.l    d7,d4
  268.         eor.l    d4,d2        ; d2=BFJNDHLP
  269.  
  270.         move.l    d2,(a1)+
  271.  
  272.         lsl.l    #4,d4
  273.         eor.l    d4,d3        ; d3=bfjndhlp
  274.  
  275.         move.l    d3,(a5)+
  276.  
  277. end_pass1loop:    dbra    d6,mainloop
  278.  
  279.     ENDC
  280.  
  281. ; wait until previous QBlit() has completely finished (signals2)
  282. ; then start the blitter in the background for passes 3 & 4
  283.  
  284. done:        move.l    #mybltnode,a2    ; a2->mybltnode
  285.         move.l    (4).w,a6    ; a6->SysBase
  286.         move.l    (ThisTask,a6),(task-mybltnode,a2) ; save task ptr
  287.         move.l    (signals2-mybltnode,a2),d0
  288.         jsr    (_LVOWait,a6)
  289.  
  290.         move.l    a2,a1
  291.         move.l    (_GfxBase),a6
  292.         jsr    (_LVOQBlit,a6)
  293.  
  294. ret:        movem.l    (sp)+,d2-d7/a2-a6
  295.         rts
  296.  
  297. ;-----------------------------------------------------------------------------
  298. ; QBlit functions (called asynchronously)
  299.  
  300. ;-------------------------------------------------
  301. ;buff2 after pass 2
  302. ;0        a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4
  303. ;2        c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4
  304. ;4        q7q6q5q4u7u6u5u4 y7y6y5y4C7C6C5C4
  305. ;6        s7s6s5s4w7w6w5w4 A7A6A5A4E7E6E5E4
  306. ;
  307. ;Pixels/4+0    b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4
  308. ;Pixels/4+2    d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4
  309. ;Pixels/4+4    r7r6r5r4v7v6v5v4 z7z6z5z4D7D6D5D4
  310. ;Pixels/4+6    t7t6t5t4x7x6x5x4 B7B6B5B4F7F6F5F4
  311. ;
  312. ;Pixels/2+0    a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0
  313. ;Pixels/2+2    c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
  314. ;Pixels/2+4    q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  315. ;Pixels/2+6    s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  316. ;
  317. ;3*Pixels/4+0    b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0    
  318. ;3*Pixels/4+2    d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  319. ;3*Pixels/4+4    r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  320. ;3*Pixels/4+6    t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  321. ;-------------------------------------------------
  322.  
  323. ;Pass 3, subpass 1
  324. ;    apt        Buff2
  325. ;    bpt        Buff2+2
  326. ;    dpt        Buff3
  327. ;    amod        2
  328. ;    bmod        2
  329. ;    dmod        0
  330. ;    cdat        $cccc
  331. ;    sizv        Pixels/4
  332. ;    sizh        1 word
  333. ;    con        D=AC+(B>>2)~C, ascending
  334.  
  335. blit31:        moveq    #-1,d0
  336.         move.l    d0,(bltafwm,a0)
  337.         move.w    #0,(bltdmod,a0)
  338.         move.l    (buff2-mybltnode,a1),d0
  339.         move.l    d0,(bltapt,a0)
  340.         addq.l    #2,d0
  341.         move.l    d0,(bltbpt,a0)
  342.         move.l    (buff3-mybltnode,a1),(bltdpt,a0)
  343.         move.w    #2,(bltamod,a0)        ; 2
  344.         move.w    #2,(bltbmod,a0)        ; 2
  345.         move.w    #$cccc,(bltcdat,a0)
  346.         move.l    #$0DE42000,(bltcon0,a0)    ; D=AC+(B>>2)~C
  347.  
  348.         move.l    (pixels4-mybltnode,a1),d0    ; pixels/4
  349. blit31a:    cmp.l    #32768,d0        ; check for overflow blitter
  350.         bls.b    blit31c            ; branch if ok
  351.         move.l    d0,(sizv-mybltnode,a1)    ; else save (too big) bltsizv
  352.         move.w    #32768,(bltsizv,a0)    ; max possible bltsizv
  353.         move.w    #1,(bltsizh,a0)        ; do blit
  354.         lea    (blit31b,pc),a0
  355.         move.l    a0,(qblitfunc-mybltnode,a1)
  356.         rts
  357.  
  358. blit31b:    move.l    (sizv-mybltnode,a1),d0    ; restore (too big) bltsizv
  359.         sub.l    #32768,d0        ; subtract number already done
  360.         bra.b    blit31a            ; loop back
  361.  
  362. blit31c:    move.w    d0,(bltsizv,a0)        ; pixels/8
  363.  
  364. ;;;        move.w    (pixels4+2-mybltnode,a1),(bltsizv,a0) ; pixels/4
  365.  
  366.         move.w    #1,(bltsizh,a0)        ;do blit
  367.         lea    (blit32,pc),a0
  368.         move.l    a0,(qblitfunc-mybltnode,a1)
  369.         rts
  370.  
  371. ;Pass 3, subpass 2
  372. ;    apt        Buff2+Pixels-2-2
  373. ;    bpt        Buff2+Pixels-2
  374. ;    dpt        Buff3+Pixels-2
  375. ;    amod        2
  376. ;    bmod        2
  377. ;    dmod        0
  378. ;    cdat        $cccc
  379. ;    sizv        Pixels/4
  380. ;    sizh        1 word
  381. ;    con        D=(A<<2)C+B~C, descending
  382.  
  383. blit32:        move.l    (buff2-mybltnode,a1),d0
  384.         add.l    (pixels-mybltnode,a1),d0
  385.         subq.l    #2+2,d0
  386.         move.l    d0,(bltapt,a0)        ; buff2+pixels-2-2
  387.         addq.l    #2,d0
  388.         move.l    d0,(bltbpt,a0)        ; buff2+pixels-2
  389.         move.l    (buff3-mybltnode,a1),d0
  390.         add.l    (pixels-mybltnode,a1),d0
  391.         subq.l    #2,d0
  392.         move.l    d0,(bltdpt,a0)        ; buff3+pixels-2
  393.         move.l    #$2DE40002,(bltcon0,a0)    ; D=(A<<2)C+B~C, desc.
  394.  
  395.         move.l    (pixels4-mybltnode,a1),d0    ; pixels/4
  396. blit32a:    cmp.l    #32768,d0        ; check for overflow blitter
  397.         bls.b    blit32c            ; branch if ok
  398.         move.l    d0,(sizv-mybltnode,a1)    ; else save (too big) bltsizv
  399.         move.w    #32768,(bltsizv,a0)    ; max possible bltsizv
  400.         move.w    #1,(bltsizh,a0)        ; do blit
  401.         lea    (blit32b,pc),a0
  402.         move.l    a0,(qblitfunc-mybltnode,a1)
  403.         rts
  404.  
  405. blit32b:    move.l    (sizv-mybltnode,a1),d0    ; restore (too big) bltsizv
  406.         sub.l    #32768,d0        ; subtract number already done
  407.         bra.b    blit32a            ; loop back
  408.  
  409. blit32c:    move.w    d0,(bltsizv,a0)        ; pixels/8
  410.  
  411.         move.w    #1,(bltsizh,a0)        ;do blit
  412.     IFGT depth-6
  413.         lea    (blit47,pc),a0
  414.     ELSE
  415.         lea    (blit43,pc),a0
  416.     ENDC
  417.         move.l    a0,(qblitfunc-mybltnode,a1)
  418.         rts
  419.  
  420. ;-------------------------------------------------
  421. ;buff3 after pass 3
  422. ;0        a7a6c7c6e7e6g7g6 i7i6k7k6m7m6o7o6
  423. ;2        q7q6s7s6u7u6w7w6 y7y6A7A6C7C6E7E6
  424. ;
  425. ;Pixels/8+0    b7b6d7d6f7f6h7h6 j7j6l7l6n7n6p7p6
  426. ;Pixels/8+2    r7r6t7t6v7v6x7x6 z7z6B7B6D7D6F7F6
  427. ;
  428. ;Pixels/4+0    a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2
  429. ;Pixels/4+2    q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  430. ;
  431. ;3*Pixels/8+0    b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  432. ;3*Pixels/8+2    r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  433. ;
  434. ;Pixels/2+0    a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4
  435. ;Pixels/2+2    q5q4s5s4u5u4w5w4 y5y4A5A4C5C4E5E4
  436. ;
  437. ;5*Pixels/8+0    b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  438. ;5*Pixels/8+2    r5r4t5t4v5v4x5x4 z5z4B5B4D5D4F5F4
  439. ;
  440. ;3*Pixels/4+0    a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0
  441. ;3*Pixels/4+2    q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  442. ;
  443. ;7*Pixels/8+0    b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  444. ;7*Pixels/8+2    r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  445. ;-------------------------------------------------
  446.  
  447.     IFGT depth-6
  448.  
  449. ;Pass 4, plane 7
  450. ;    apt        Buff3+0*pixels/8
  451. ;    bpt        Buff3+1*pixels/8
  452. ;    dpt        Plane7+offset
  453. ;    amod        0
  454. ;    bmod        0
  455. ;    dmod        0
  456. ;    cdat        $aaaa
  457. ;    sizv        Pixels/16
  458. ;    sizh        1 word
  459. ;    con        D=AC+(B>>1)~C, ascending
  460.  
  461. blit47:        movem.l    a2,-(sp)
  462.  
  463.         move.w    #0,(bltamod,a0)
  464.         move.w    #0,(bltbmod,a0)
  465.         move.w    (pixels16+2-mybltnode,a1),(bltsizv,a0)    ; pixels/16
  466.         move.w    #$aaaa,(bltcdat,a0)
  467.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  468.  
  469.         move.l    (buff3-mybltnode,a1),d0
  470.         move.l    d0,(bltapt,a0)        ; buff3+0*pixels/8
  471.         add.l    (pixels8-mybltnode,a1),d0
  472.         move.l    d0,(bltbpt,a0)        ; buff3+1*pixels/8
  473.         move.l    (planes-mybltnode,a1),a2
  474.         move.l    (7*4,a2),d0
  475.         add.l    (offset-mybltnode,a1),d0
  476.         move.l    d0,(bltdpt,a0)        ; Plane7+offset
  477.         move.w    #1,(bltsizh,a0)        ;plane 7
  478.  
  479.         movem.l    a1/a6,-(sp)
  480.         move.l    (signals1-mybltnode,a1),d0
  481.         move.l    (task-mybltnode,a1),a1
  482.         move.l    (4).w,a6        ; a6->SysBase
  483.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  484.         movem.l    (sp)+,a1/a6
  485.  
  486.         lea    (blit43,pc),a0
  487.         move.l    a0,(qblitfunc-mybltnode,a1)
  488.         movem.l    (sp)+,a2
  489.         rts
  490.  
  491. ;-------------------------------------------------
  492. ;Plane7        a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7
  493. ;Plane7+2    q7r7s7t7u7v7w7x7 y7z7A7B7C7D7E7F7
  494. ;-------------------------------------------------
  495.  
  496.     ENDC
  497.  
  498. ;Pass 4, plane 3
  499. ;    apt        buff3+2*pixels/8
  500. ;    bpt        buff3+3*pixels/8
  501. ;    dpt        Plane3+offset
  502. ;    amod        0
  503. ;    bmod        0
  504. ;    dmod        0
  505. ;    cdat        $aaaa
  506. ;    sizv        pixels/16
  507. ;    sizh        1 word
  508. ;    con        D=AC+(B>>1)~C, ascending
  509.  
  510. blit43:        move.l    a2,-(sp)        ; preserve a2
  511.     IFLE depth-6
  512.         move.w    #0,(bltamod,a0)
  513.         move.w    #0,(bltbmod,a0)
  514.         move.w    (pixels16+2-mybltnode,a1),(bltsizv,a0)    ; pixels/16
  515.         move.w    #$aaaa,(bltcdat,a0)
  516.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  517.     ENDC
  518.         move.l    (buff3-mybltnode,a1),d0
  519.         add.l    (pixels4-mybltnode,a1),d0
  520.         move.l    d0,(bltapt,a0)        ; buff3+2*pixels/8
  521.         add.l    (pixels8-mybltnode,a1),d0
  522.         move.l    d0,(bltbpt,a0)        ; buff3+3*pixels/8
  523.         move.l    (planes-mybltnode,a1),a2
  524.         move.l    (3*4,a2),d0
  525.         add.l    (offset-mybltnode,a1),d0
  526.         move.l    d0,(bltdpt,a0)        ; Plane3+offset
  527.         move.w    #1,(bltsizh,a0)        ;plane 3
  528.     IFLE depth-6
  529.         movem.l    a1/a6,-(sp)
  530.         move.l    (signals1-mybltnode,a1),d0
  531.         move.l    (task-mybltnode,a1),a1
  532.         move.l    (4).w,a6        ; a6->SysBase
  533.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  534.         movem.l    (sp)+,a1/a6
  535.     ENDC
  536.         lea    (blit45,pc),a0
  537.         move.l    a0,(qblitfunc-mybltnode,a1)
  538.         move.l    (sp)+,a2        ; restore a2
  539.         rts
  540.  
  541. ;-------------------------------------------------
  542. ;Plane3        a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3
  543. ;Plane3+2    q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  544. ;-------------------------------------------------
  545.  
  546. ;Pass 4, plane 5
  547. ;    apt        buff3+4*pixels/8
  548. ;    bpt        buff3+5*pixels/8
  549. ;    dpt        Plane5+offset
  550. ;    amod        0
  551. ;    bmod        0
  552. ;    dmod        0
  553. ;    cdat        $aaaa
  554. ;    sizv        pixels/16
  555. ;    sizh        1 word
  556. ;    con        D=AC+(B>>1)~C, ascending
  557.  
  558. blit45:        move.l    a2,d1            ; preserve a2
  559.         move.l    (buff3-mybltnode,a1),d0
  560.         add.l    (pixels2-mybltnode,a1),d0
  561.         move.l    d0,(bltapt,a0)        ; buff3+4*pixels/8
  562.         add.l    (pixels8-mybltnode,a1),d0
  563.         move.l    d0,(bltbpt,a0)        ; buff3+5*pixels/8
  564.         move.l    (planes-mybltnode,a1),a2
  565.         move.l    (5*4,a2),d0
  566.         add.l    (offset-mybltnode,a1),d0
  567.         move.l    d0,(bltdpt,a0)        ; Plane5+offset
  568.         move.w    #1,(bltsizh,a0)        ;plane 5
  569.         lea    (blit41,pc),a0
  570.         move.l    a0,(qblitfunc-mybltnode,a1)
  571.         move.l    d1,a2            ; restore a2
  572.         rts
  573.  
  574. ;-------------------------------------------------
  575. ;Plane5        a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5
  576. ;Plane5+2    q5r5s5t5u5v5w5x5 y5z5A5B5C5D5E5F5
  577. ;-------------------------------------------------
  578.  
  579. ;Pass 4, plane 1
  580. ;    apt        buff3+6*pixels/8
  581. ;    bpt        buff3+7*pixels/8
  582. ;    dpt        Plane1+offset
  583. ;    amod        0
  584. ;    bmod        0
  585. ;    dmod        0
  586. ;    cdat        $aaaa
  587. ;    sizv        pixels/16
  588. ;    sizh        1 word
  589. ;    con        D=AC+(B>>1)~C, ascending
  590.  
  591. blit41:        move.l    a2,d1            ; preserve a2
  592.         move.l    (buff3-mybltnode,a1),d0
  593.         add.l    (pixels4-mybltnode,a1),d0
  594.         add.l    (pixels2-mybltnode,a1),d0
  595.         move.l    d0,(bltapt,a0)        ; buff3+6*pixels/8
  596.         add.l    (pixels8-mybltnode,a1),d0
  597.         move.l    d0,(bltbpt,a0)        ; buff3+7*pixels/8
  598.         move.l    (planes-mybltnode,a1),a2
  599.         move.l    (1*4,a2),d0
  600.         add.l    (offset-mybltnode,a1),d0
  601.         move.l    d0,(bltdpt,a0)        ; Plane1+offset
  602.         move.w    #1,(bltsizh,a0)        ;plane 1
  603.     IFGT depth-6
  604.         lea    (blit46,pc),a0
  605.     ELSE
  606.         lea    (blit42,pc),a0
  607.     ENDC
  608.         move.l    a0,(qblitfunc-mybltnode,a1)
  609.         move.l    d1,a2            ; restore a2
  610.         rts
  611.  
  612. ;-------------------------------------------------
  613. ;Plane1        a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1
  614. ;Plane1+2    q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  615. ;-------------------------------------------------
  616.  
  617.     IFGT depth-6
  618.  
  619. ;Pass 4, plane 6
  620. ;    apt        buff3+1*pixels/8-2
  621. ;    bpt        buff3+2*pixels/8-2
  622. ;    dpt        Plane6+plsiz-2+offset
  623. ;    amod        0
  624. ;    bmod        0
  625. ;    dmod        0
  626. ;    cdat        $aaaa
  627. ;    sizv        pixels/16
  628. ;    sizh        1 word
  629. ;    con        D=(A<<1)C+B~C, descending
  630.  
  631. blit46:        move.l    a2,d1            ; preserve a2
  632.         move.l    (buff3-mybltnode,a1),d0
  633.         add.l    (pixels8-mybltnode,a1),d0
  634.         subq.l    #2,d0
  635.         move.l    d0,(bltapt,a0)        ; buff3+1*pixels/8-2
  636.         add.l    (pixels8-mybltnode,a1),d0
  637.         move.l    d0,(bltbpt,a0)        ; buff3+2*pixels/8-2
  638.         move.l    (planes-mybltnode,a1),a2
  639.         move.l    (6*4,a2),d0
  640.         add.l    (offset-mybltnode,a1),d0
  641.         add.l    (pixels8-mybltnode,a1),d0
  642.         subq.l    #2,d0
  643.         move.l    d0,(bltdpt,a0)        ; Plane6+offset+plsiz-2
  644.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  645.         move.w    #1,(bltsizh,a0)        ;plane 6
  646.         lea    (blit42,pc),a0
  647.         move.l    a0,(qblitfunc-mybltnode,a1)
  648.         move.l    d1,a2            ; restore a2
  649.         rts
  650.  
  651. ;-------------------------------------------------
  652. ;Plane6        a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6
  653. ;Plane6+2    q6r6s6t6u6v6w6x6 y6z6A6B6C6D6E6F6
  654. ;-------------------------------------------------
  655.  
  656.     ENDC
  657.  
  658. ;Pass 4, plane 2
  659. ;    apt        buff3+3*pixels/8-2
  660. ;    bpt        buff3+4*pixels/8-2
  661. ;    dpt        Plane2+plsiz-2+offset
  662. ;    amod        0
  663. ;    bmod        0
  664. ;    dmod        0
  665. ;    cdat        $aaaa
  666. ;    sizv        pixels/16
  667. ;    sizh        1 word
  668. ;    con        D=(A<<1)C+B~C, descending
  669.  
  670. blit42:        move.l    a2,d1            ; preserve a2
  671.         move.l    (buff3-mybltnode,a1),d0
  672.         add.l    (pixels2-mybltnode,a1),d0
  673.         subq.l    #2,d0
  674.         move.l    d0,(bltbpt,a0)        ; buff3+4*pixels/8-2
  675.         sub.l    (pixels8-mybltnode,a1),d0
  676.         move.l    d0,(bltapt,a0)        ; buff3+3*pixels/8-2
  677.         move.l    (planes-mybltnode,a1),a2
  678.         move.l    (2*4,a2),d0
  679.         add.l    (offset-mybltnode,a1),d0
  680.         add.l    (pixels8-mybltnode,a1),d0
  681.         subq.l    #2,d0
  682.         move.l    d0,(bltdpt,a0)        ; Plane2+offset+plsiz-2
  683.     IFLE depth-6
  684.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  685.     ENDC
  686.         move.w    #1,(bltsizh,a0)        ;plane 2
  687.         lea    (blit44,pc),a0
  688.         move.l    a0,(qblitfunc-mybltnode,a1)
  689.         move.l    d1,a2            ; restore a2
  690.         rts
  691.  
  692. ;-------------------------------------------------
  693. ;Plane2        a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  694. ;Plane2+2    q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  695. ;-------------------------------------------------
  696.  
  697. ;Pass 4, plane 4
  698. ;    apt        buff3+5*pixels/8-2
  699. ;    bpt        buff3+6*pixels/8-2
  700. ;    dpt        Plane4+plsiz-2+offset
  701. ;    amod        0
  702. ;    bmod        0
  703. ;    dmod        0
  704. ;    cdat        $aaaa
  705. ;    sizv        pixels/16
  706. ;    sizh        1 word
  707. ;    con        D=(A<<1)C+B~C, descending
  708.  
  709. blit44:        move.l    a2,d1            ; preserve a2
  710.         move.l    (buff3-mybltnode,a1),d0
  711.         add.l    (pixels2-mybltnode,a1),d0
  712.         add.l    (pixels4-mybltnode,a1),d0
  713.         subq.l    #2,d0
  714.         move.l    d0,(bltbpt,a0)        ; buff3+6*pixels/8-2
  715.         sub.l    (pixels8-mybltnode,a1),d0
  716.         move.l    d0,(bltapt,a0)        ; buff3+5*pixels/8-2
  717.         move.l    (planes-mybltnode,a1),a2
  718.         move.l    (4*4,a2),d0
  719.         add.l    (offset-mybltnode,a1),d0
  720.         add.l    (pixels8-mybltnode,a1),d0
  721.         subq.l    #2,d0
  722.         move.l    d0,(bltdpt,a0)        ; Plane4+offset+plsiz-2
  723.         move.w    #1,(bltsizh,a0)        ;plane 4
  724.         lea    (blit40,pc),a0
  725.         move.l    a0,(qblitfunc-mybltnode,a1)
  726.         move.l    d1,a2            ; restore a2
  727.         rts
  728.  
  729. ;-------------------------------------------------
  730. ;Plane4        a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  731. ;Plane4+2    q4r4s4t4u4v4w4x4 y4z4A4B4C4D4E4F4
  732. ;-------------------------------------------------
  733.  
  734. ;Pass 4, plane 0
  735. ;    apt        buff3+7*pixels/8-2
  736. ;    bpt        buff3+8*pixels/8-2
  737. ;    dpt        Plane0+plsiz-2+offset
  738. ;    amod        0
  739. ;    bmod        0
  740. ;    dmod        0
  741. ;    cdat        $aaaa
  742. ;    sizv        pixels/16
  743. ;    sizh        1 word
  744. ;    con        D=(A<<1)C+B~C, descending
  745.  
  746. blit40:        move.l    a2,d1            ; preserve a2
  747.         move.l    (buff3-mybltnode,a1),d0
  748.         add.l    (pixels-mybltnode,a1),d0
  749.         subq.l    #2,d0
  750.         move.l    d0,(bltbpt,a0)        ; buff3+8*pixels/8-2
  751.         sub.l    (pixels8-mybltnode,a1),d0
  752.         move.l    d0,(bltapt,a0)        ; buff3+7*pixels/8-2
  753.         move.l    (planes-mybltnode,a1),a2
  754.         move.l    (a2),d0
  755.         add.l    (offset-mybltnode,a1),d0
  756.         add.l    (pixels8-mybltnode,a1),d0
  757.         subq.l    #2,d0
  758.         move.l    d0,(bltdpt,a0)        ; Plane0+offset+plsiz-2
  759.         move.w    #1,(bltsizh,a0)        ;plane 0
  760.         lea    (blit31,pc),a0
  761.         move.l    a0,(qblitfunc-mybltnode,a1)
  762.         move.l    d1,a2            ; restore a2
  763.         moveq    #0,d0            ; set Z flag
  764.         rts
  765.  
  766. ;-------------------------------------------------
  767. ;Plane0        a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  768. ;Plane0+2    q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  769. ;-------------------------------------------------
  770.  
  771. qblitcleanup:    movem.l    a2/a6,-(sp)
  772.         move.l    #mybltnode,a2
  773.         move.l    (task-mybltnode,a2),a1    ; signal QBlit() has finished
  774.         move.l    (signals2-mybltnode,a2),d0
  775.         move.l    (4).w,a6
  776.         jsr    (_LVOSignal,a6)        ; may be called from interrupts
  777.         move.l    (othertask-mybltnode,a2),a1
  778.         move.l    (signals3-mybltnode,a2),d0
  779.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  780.         movem.l    (sp)+,a2/a6
  781.         rts
  782.  
  783. ;-----------------------------------------------------------------------------
  784.         section    data,data
  785.  
  786.         cnop    0,4
  787. mybltnode:    dc.l    0        ; next bltnode
  788. qblitfunc:    dc.l    blit31        ; ptr to qblitfunc()
  789.         dc.b    cleanup        ; stat
  790.         dc.b    0        ; filler
  791.         dc.w    0        ; blitsize
  792.         dc.w    0        ; beamsync
  793.         dc.l    qblitcleanup    ; ptr to qblitcleanup()
  794.  
  795.         cnop    0,4
  796. chunky:        dc.l    0        ; ptr to original chunky data
  797. planes:        dc.l    0        ; ptr to list of output plane ptrs
  798. pixels:        dc.l    0        ; width*height
  799. pixels2:    dc.l    0        ; width*height/2
  800. pixels4:    dc.l    0        ; width*height/4
  801. pixels8:    dc.l    0        ; width*height/8
  802. pixels16:    dc.l    0        ; width*height/16
  803. offset:        dc.l    0        ; byte offset into plane
  804. task:        dc.l    0        ; ptr to this task
  805. othertask:    dc.l    0        ; ptr to other task
  806. signals1:    dc.l    0        ; signals to Signal() task after pass 3
  807. signals2:    dc.l    0        ; signals to Signal() task at cleanup
  808. signals3:    dc.l    0        ; signals to Signal() othertask at cleanup
  809. sizv        dc.l    0
  810. buff2        dc.l    0        ; width*height chip buffer 2
  811. buff3        dc.l    0        ; width*height chip buffer 3
  812. xlate:        dc.l    0
  813. force_update:    dc.w    0
  814.  
  815. ;-----------------------------------------------------------------------------
  816. ;        section    segment1,bss,chip        ; MUST BE IN CHIP !!!!!
  817.  
  818. ;buff2        ds.b    maxpixels    ;Intermediate buffer 2
  819. ;buff3        ds.b    maxpixels    ;Intermediate buffer 3
  820.  
  821. ;-----------------------------------------------------------------------------
  822.  
  823.         end
  824.